package com.yimi.yinhepda.utils;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池辅助类，整个应用程序就只有一个线程池去管理线程。
 * 可以设置核心线程数、最大线程数、额外线程空状态生存时间，阻塞队列长度来优化线程池。
 *
 * @author ws
 */
public class ThreadPoolUtils {
  private ThreadPoolUtils() {

  }

  //线程池核心线程数
  private static int CORE_POOL_SIZE = 5;

  //线程池最大线程数
  private static int MAX_POOL_SIZE = 100;

  //额外线程空状态生存时间
  private static int KEEP_ALIVE_TIME = 10000;

  //阻塞队列。当核心线程都被占用，且阻塞队列已满的情况下，才会开启额外线程。
  private static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(10);

  private static ThreadFactory threadFactory = new ThreadFactory() {

    @Override public Thread newThread(Runnable r) {
      return new Thread(r);
    }
  };
  private static ThreadPoolExecutor threadPool;

  static {
    threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, threadFactory);
  }

  public static void execute(Runnable runable) {
    threadPool.execute(runable);
  }
}
